import logging
import os
from logging.handlers import TimedRotatingFileHandler
from datetime import datetime
from typing import Optional
from pathlib import Path
class PrefixDateLogger:
    """
    基于文件名前缀和日期的日志记录器
    """

    def __init__(self,
                 log_prefix: str,
                 level: int = logging.INFO,
                 fmt: Optional[str] = None,
                 when: str = 'midnight',
                 backup_count: int = 30):
        """
        初始化日志记录器

        Args:
            log_prefix: 日志文件名前缀
            log_dir: 日志目录
            level: 日志级别
            fmt: 日志格式
            when: 滚动时间单位 ('S', 'M', 'H', 'D', 'midnight')
            backup_count: 保留的备份文件数量
        """
        self.log_prefix = log_prefix
        self.log_dir=str(Path.cwd())+"/logs/"
        self.level = level
        self.when = when
        self.backup_count = backup_count

        # 默认日志格式
        if fmt is None:
            self.fmt = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
        else:
            self.fmt = fmt

        # 创建日志目录
        self._create_log_dir()

        # 初始化日志记录器
        self.logger = self._setup_logger()

    def _create_log_dir(self):
        """创建日志目录"""
        if not os.path.exists(self.log_dir):
            os.makedirs(self.log_dir)

    def _get_log_file_path(self):
        """获取当前日志文件路径"""
        date_str = datetime.now().strftime('%Y-%m-%d')
        filename = f"{self.log_prefix}_{date_str}.log"
        return os.path.join(self.log_dir, filename)

    def _setup_logger(self):
        """设置日志记录器"""
        # 创建logger
        logger_name = f"{self.log_prefix}_logger"
        logger = logging.getLogger(logger_name)
        logger.setLevel(self.level)

        # 避免重复添加handler
        if logger.handlers:
            logger.handlers.clear()

        # 创建文件handler（按日期滚动）
        log_file = self._get_log_file_path()
        file_handler = TimedRotatingFileHandler(
            filename=log_file,
            when=self.when,
            interval=1,
            backupCount=self.backup_count,
            encoding='utf-8'
        )

        # 设置格式
        formatter = logging.Formatter(self.fmt)
        file_handler.setFormatter(formatter)

        # 添加handler到logger
        logger.addHandler(file_handler)

        # 可选：添加控制台handler
        console_handler = logging.StreamHandler()
        console_handler.setFormatter(formatter)
        logger.addHandler(console_handler)

        return logger

    def get_logger(self):
        """获取配置好的logger对象"""
        return self.logger

    def info(self, msg, *args, **kwargs):
        """记录INFO级别日志"""
        self.logger.info(msg, *args, **kwargs)

    def debug(self, msg, *args, **kwargs):
        """记录DEBUG级别日志"""
        self.logger.debug(msg, *args, **kwargs)

    def warning(self, msg, *args, **kwargs):
        """记录WARNING级别日志"""
        self.logger.warning(msg, *args, **kwargs)

    def error(self, msg, *args, **kwargs):
        """记录ERROR级别日志"""
        self.logger.error(msg, *args, **kwargs)

    def critical(self, msg, *args, **kwargs):
        """记录CRITICAL级别日志"""
        self.logger.critical(msg, *args, **kwargs)

    def exception(self, msg, *args, **kwargs):
        """记录异常信息"""
        self.logger.exception(msg, *args, **kwargs)


if __name__ == "__main__":
    # 运行演示
    # 创建日志记录器
    logger = PrefixDateLogger("myapp")

    # 记录日志
    logger.info("应用程序启动")
    logger.debug("调试信息")
    logger.error("错误信息")

    print("\n=== 演示完成 ===")
    print("日志文件已生成在相应的目录中")

    # 可选：清理测试日志
    # cleanup_test_logs()